热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

异步{...AsyncAdd...}和异步{...AsyncAdd...}有什么区别?

如何解决《异步{AsyncAdd}和异步{AsyncAdd}有什么区别?》经验,为你挑选了1个好方法。

在以下代码中,do! ag.AsyncAdd (Some i)ag.AsyncAdd (Some i)(在函数中enqueue())均起作用。它们之间有什么区别?似乎do! ...会使入队和出队电话更加混杂?怎么样?

open FSharpx.Control

let test () =
    let ag = new BlockingQueueAgent(500)

    let enqueue() = async { 
        for i = 1 to 15 do 
            // ag.AsyncAdd (Some i) // works too
            do! ag.AsyncAdd (Some i) 
            printfn "=> %d" i }

    async {
        do! [ for i = 1 to 10 do yield enqueue() ] 
            |> Async.Parallel |> Async.Ignore
        for i = 1 to 5 do ag.Add None
    } |> Async.Start

    let rec dequeue() =
        async {
            let! m = ag.AsyncGet()
            match m with
            | Some v ->
                printfn "<= %d" v
                return! dequeue()
            | None -> 
                printfn "Done" 
        }

    [ for i = 1 to 5 do yield dequeue() ] 
    |> Async.Parallel |> Async.Ignore |> Async.RunSynchronously
    0

rmunn.. 6

在任何F#计算表达式中,任何以结尾结尾的关键字都!倾向于表示“根据此块的规则专门处理此问题”。例如,在一个async { }块中,let!关键字的含义是“等待结果,然后将结果分配给此变量”,do!关键字的含义是“等待此异步操作,但丢弃结果,而不将其分配给任何对象”。如果您使用do!关键字,那么您就不在等待该操作的结果。

因此,使用函数中的do!关键字enqueue,您将执行以下十五次:

开始一项AsyncAdd手术

等待它完成

打印“ => 1”(或2或3 ...)

如果没有一个do!关键字,你正在做的情况如下:

AsyncAdd尽快开始15项操作

逐一踢完后,打印“ => 1”(或2或3 ...)

听起来您似乎还不完全了解F#的计算表达式在后台如何工作。我建议阅读Scott Wlaschin的优秀网站以获取更多了解:首先https://fsharpforfunandprofit.com/posts/concurrency-async-and-parallel/然后是https://fsharpforfunandprofit.com/series/computation-expressions.html,当您阅读第二系列文章时,您将以一些现有知识为基础。



1> rmunn..:

在任何F#计算表达式中,任何以结尾结尾的关键字都!倾向于表示“根据此块的规则专门处理此问题”。例如,在一个async { }块中,let!关键字的含义是“等待结果,然后将结果分配给此变量”,do!关键字的含义是“等待此异步操作,但丢弃结果,而不将其分配给任何对象”。如果您使用do!关键字,那么您就不在等待该操作的结果。

因此,使用函数中的do!关键字enqueue,您将执行以下十五次:

开始一项AsyncAdd手术

等待它完成

打印“ => 1”(或2或3 ...)

如果没有一个do!关键字,你正在做的情况如下:

AsyncAdd尽快开始15项操作

逐一踢完后,打印“ => 1”(或2或3 ...)

听起来您似乎还不完全了解F#的计算表达式在后台如何工作。我建议阅读Scott Wlaschin的优秀网站以获取更多了解:首先https://fsharpforfunandprofit.com/posts/concurrency-async-and-parallel/然后是https://fsharpforfunandprofit.com/series/computation-expressions.html,当您阅读第二系列文章时,您将以一些现有知识为基础。


推荐阅读
  • 本文详细介绍了如何使用jQuery防止事件冒泡,确保子元素的点击事件不会触发父元素或祖先元素的相应事件。通过具体的代码示例和解释,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • Babylon.js 实例展示
    探索 Babylon.js 的强大功能,通过全屏演示体验其卓越性能。本文提供在线文档链接和默认渲染管线的源码调试地址,帮助您深入了解 Babylon.js 的工作原理。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍了 JavaScript 中的条件判断(if-else 和 switch)以及循环控制(for、while 和 do-while)。我们将探讨这些结构的基本语法、使用场景及注意事项,并补充一些实用技巧。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 在网页开发中,页面加载速度是一个关键的用户体验因素。为了提升加载效率,避免在PageLoad事件中进行大量数据绑定操作,可以采用异步加载和特定控件来优化页面加载过程。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
  • 本文介绍了如何使用 Python 的 Bokeh 库在图表上绘制菱形标记。Bokeh 是一个强大的交互式数据可视化工具,支持丰富的图形自定义选项。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍了如何通过配置 Android Studio 和 Gradle 来显著提高构建性能,涵盖内存分配优化、并行构建和性能分析等实用技巧。 ... [详细]
author-avatar
maggieting0334_990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有